package com.br.fsm.projectdelivery.repositorio;

import java.util.ArrayList;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.SQLException;
import android.util.Log;

import com.br.fsm.projectdelivery.activity.R;
import com.br.fsm.projectdelivery.basica.Endereco;
import com.br.fsm.projectdelivery.basica.Endereco.Enderecos;
import com.br.fsm.projectdelivery.excecao.RepositorioException;
import com.br.fsm.projectdelivery.util.Constantes;
import com.br.fsm.projectdelivery.util.Util;

public class RepositorioEndereco extends RepositorioBasico implements IRepositorioEndereco {

	private static RepositorioEndereco instance;	
	
	public static final String TABLE_NAME = "ENDERECO";
	
	public static RepositorioEndereco getInstance(){
		if ( instance == null ){
			instance =  new RepositorioEndereco();
		} 
		return instance;
	}

	@Override
	public Endereco getEnderecoById(int id) throws RepositorioException {
		Cursor cursor = null;
		
		Endereco endereco = null;
		
		try {
			cursor = db.query(TABLE_NAME, Endereco.getColumns(), Enderecos.ID + " = " + id , null,
					null, null, null, null);
			
			if (cursor.moveToFirst()) {
				
				endereco = new Endereco();
				
				int idxId = cursor.getColumnIndex(Enderecos.ID);
				int idxLogradouro = cursor.getColumnIndex(Enderecos.LOGRADOURO);
				int idxNumero = cursor.getColumnIndex(Enderecos.NUMERO);
				int idxComplemento = cursor.getColumnIndex(Enderecos.COMPLEMENTO);
				int idxBairro = cursor.getColumnIndex(Enderecos.BAIRRO);
				int idxCidade = cursor.getColumnIndex(Enderecos.CIDADE);
				int idxEstado = cursor.getColumnIndex(Enderecos.ESTADO);
				int idxCep = cursor.getColumnIndex(Enderecos.CEP);
				int idxUltimaAlteracao = cursor.getColumnIndex(Enderecos.ULTIMAALTERACAO);
				
				endereco.setEnderecoId(cursor.getInt(idxId));
				endereco.setEnderecoLogradouro(cursor.getString(idxLogradouro));
				endereco.setEnderecoNumero(cursor.getInt(idxNumero));
				endereco.setEnderecoComplemento(cursor.getString(idxComplemento));
				endereco.setEnderecoBairro(cursor.getString(idxBairro));
				endereco.setEnderecoCidade(cursor.getString(idxCidade));
				endereco.setEnderecoEstado(cursor.getString(idxEstado));
				endereco.setEnderecoCEP(cursor.getString(idxCep));
				endereco.setEnderecoUltimaAlteracao(Util.convertDateStrToDate(cursor.getString(idxUltimaAlteracao)));
			}
		} catch (Exception e) {
			e.printStackTrace();
			Log.e( Constantes.CATEGORIA , e.getMessage());
			throw new RepositorioException(context.getResources().getString(
					R.string.db_error));
		} finally {
			if (cursor != null) {
				cursor.close();
			}
		}
		return endereco;
	}

	@Override
	public ArrayList<Endereco> getAllEndereco() throws RepositorioException {
		Cursor cursor = null;
		
		ArrayList<Endereco> enderecos = null;
		try {
			enderecos = new ArrayList<Endereco>();
			cursor = db.query(TABLE_NAME, Endereco.getColumns(), null , null,
					null, null, null, null);
			
			if (cursor.moveToFirst()) {
				
				int idxId = cursor.getColumnIndex(Enderecos.ID);
				int idxLogradouro = cursor.getColumnIndex(Enderecos.LOGRADOURO);
				int idxNumero = cursor.getColumnIndex(Enderecos.NUMERO);
				int idxComplemento = cursor.getColumnIndex(Enderecos.COMPLEMENTO);
				int idxBairro = cursor.getColumnIndex(Enderecos.BAIRRO);
				int idxCidade = cursor.getColumnIndex(Enderecos.CIDADE);
				int idxEstado = cursor.getColumnIndex(Enderecos.ESTADO);
				int idxCep = cursor.getColumnIndex(Enderecos.CEP);
				int idxUltimaAlteracao = cursor.getColumnIndex(Enderecos.ULTIMAALTERACAO);
									
				do {
					Endereco endereco = new Endereco();
					
					endereco.setEnderecoId(cursor.getInt(idxId));
					endereco.setEnderecoLogradouro(cursor.getString(idxLogradouro));
					endereco.setEnderecoNumero(cursor.getInt(idxNumero));
					endereco.setEnderecoComplemento(cursor.getString(idxComplemento));
					endereco.setEnderecoBairro(cursor.getString(idxBairro));
					endereco.setEnderecoCidade(cursor.getString(idxCidade));
					endereco.setEnderecoEstado(cursor.getString(idxEstado));
					endereco.setEnderecoCEP(cursor.getString(idxCep));
					endereco.setEnderecoUltimaAlteracao(Util.convertDateStrToDate(cursor.getString(idxUltimaAlteracao)));
					
					enderecos.add(endereco);
				} while (cursor.moveToNext());
				
			}
		} catch (Exception e) {
			e.printStackTrace();			
			Log.e( Constantes.CATEGORIA, e.getMessage());
			throw new RepositorioException(context.getResources().getString(
					R.string.db_error));
		} finally {
			if (cursor != null) {
				cursor.close();
			}
		}
		return enderecos;
	}

	@Override
	public void insertEndereco(Endereco endereco) throws RepositorioException {
		ContentValues values = new ContentValues();

		values.put(Enderecos.LOGRADOURO, endereco.getEnderecoLogradouro());
		values.put(Enderecos.NUMERO, endereco.getEnderecoNumero());
		values.put(Enderecos.COMPLEMENTO, endereco.getEnderecoComplemento());
		values.put(Enderecos.BAIRRO, endereco.getEnderecoBairro());
		values.put(Enderecos.CIDADE, endereco.getEnderecoCidade());
		values.put(Enderecos.ESTADO, endereco.getEnderecoEstado());
		values.put(Enderecos.CEP, endereco.getEnderecoCEP());
		String data = Util.convertDateToDateStr(Util.getCurrentDateTime());
		values.put(Enderecos.ULTIMAALTERACAO, data);

		try {
			db.insert(TABLE_NAME, "", values);
		} catch (SQLException sqe) {
			sqe.printStackTrace();
			Log.e( Constantes.CATEGORIA , sqe.getMessage());
			throw new RepositorioException(context.getResources().getString(
					R.string.db_error));
		}		
	}

	@Override
	public void updateEndereco(Endereco endereco) throws RepositorioException {
		ContentValues values = new ContentValues();

		values.put(Enderecos.LOGRADOURO, endereco.getEnderecoLogradouro());
		values.put(Enderecos.NUMERO, endereco.getEnderecoNumero());
		values.put(Enderecos.COMPLEMENTO, endereco.getEnderecoComplemento());
		values.put(Enderecos.BAIRRO, endereco.getEnderecoBairro());
		values.put(Enderecos.CIDADE, endereco.getEnderecoCidade());
		values.put(Enderecos.ESTADO, endereco.getEnderecoEstado());
		values.put(Enderecos.CEP, endereco.getEnderecoCEP());
		String data = Util.convertDateToDateStr(Util.getCurrentDateTime());
		values.put(Enderecos.ULTIMAALTERACAO, data);

		String _id = String.valueOf(endereco.getEnderecoId());

		String where = Enderecos.ID + "=?";
		String[] whereArgs = new String[] { _id };

		try {
			db.update(TABLE_NAME, values, where, whereArgs);
		} catch (SQLException sqe) {
			sqe.printStackTrace();
			Log.e( Constantes.CATEGORIA , sqe.getMessage());
			throw new RepositorioException(context.getResources().getString(
					R.string.db_error));
		}
	}

	@Override
	public void removeEndereco(Endereco endereco) throws RepositorioException {
		String _id = String.valueOf(endereco.getEnderecoId());

		String where = Enderecos.ID + "=?";
		String[] whereArgs = new String[] { _id };

		try {
			db.delete( TABLE_NAME, where, whereArgs);
		} catch (SQLException sqe) {
			sqe.printStackTrace();
			Log.e( Constantes.CATEGORIA , sqe.getMessage());
			throw new RepositorioException(context.getResources().getString(
					R.string.db_error));
		}
	}
}
